package com.ldn.database.dao.entities;

import com.mybatisflex.core.transaction.Propagation;
import com.mybatisflex.core.transaction.TransactionalManager;

import java.util.function.Supplier;

/**
 * Db 针对 MyBatis Flex com.mybatisflex.core.row.Db 的方法进行提取
 *
 * @author 李大牛家的牛 (scafel@163.com)
 * @product serverless
 * @className Db
 * @createDate 2025/2/20 - 14:21
 * @description Db 针对 MyBatis Flex com.mybatisflex.core.row.Db 的方法进行提取
 **/
public class Db {
    /**
     * 进行事务操作，返回 null 或者 false 或者 抛出异常，事务回滚
     */
    public static boolean tx(Supplier<Boolean> supplier) {
        return tx(supplier, Propagation.REQUIRED);
    }

    /**
     * 进行事务操作，返回 null 或者 false 或者 抛出异常， 事务回滚
     */
    public static boolean tx(Supplier<Boolean> supplier, Propagation propagation) {
        Boolean result = TransactionalManager.exec(supplier, propagation, false);
        return result != null && result;
    }

    /**
     * 进行事务操作，和返回结果无关，只有抛出异常时，事务回滚
     */
    public static <T> T txWithResult(Supplier<T> supplier) {
        return txWithResult(supplier, Propagation.REQUIRED);
    }

    /**
     * 进行事务操作，和返回结果无关，只有抛出异常时，事务回滚
     */
    public static <T> T txWithResult(Supplier<T> supplier, Propagation propagation) {
        return TransactionalManager.exec(supplier, propagation, true);
    }
}
